<?
/***********************************************************/
/* Class defining the DBTree
/* by Pablo Dall'Oglio 2001-2extends GtkTreeView
/***********************************************************/
class DBTree extends GtkTreeView
{   
    /***********************************************************/
    /* Constructor Method, cria a Arvore de Tabelas do BD
    /* baseado na pagina 283 do livro
    /* Php-Gtk criando aplica�oes graficas com php
    /* autor Pablo Dall'Oglio
    /* Helder Mauricio Gomes Ferreira
    /*adaptando o tulip para Php-Gtk2 2008
    /*$array = matriz contendo o menu
    /***********************************************************/
    private $model;         //modelo de dados arvore
    private $callback;     //a��o ao selecionar arquivo
    //private $selection;
    private $projects; //array contendo os dados dos projetos com base de dados
    private $selecao;
    /*
    *metodo construtor
    *Cria a arvore
    */
    
    function __construct()
    {
    /***********************************************************/
    /* Constructor Method
    /***********************************************************/
    // chama o metodo construtor da classe pai
    //mesmo que new "GtkTreeView"
    parent::__construct();
    //define a a��o para o duplo clik
    parent::connect('row-activated',array($this,'onDoubleClick'));
    $this->connect('button-release-event', array(&$this, 'onAbrirPasta'));
    
    //cria o modelo de dados e atribui a arvore
       if (defined("GObject::TYPE_STRING")) {
            $this->model = new GtkTreeStore(GObject::TYPE_OBJECT,GObject::TYPE_STRING,GObject::TYPE_STRING);
        }
        if (defined("Gtk::TYPE_STRING")) {
            $this->model = new GtkTreeStore(Gtk::TYPE_OBJECT,Gtk::TYPE_STRING,Gtk::TYPE_STRING);
        }
    parent::set_model($this->model);
    
    //cria duas colunas
    $column1 = new GtkTreeViewColumn();
    $column1->set_title('Projeto');
    
    //cria os renderizadores para as colunas
    $cell_renderer1 = new GtkCellRendererPixbuf();
    $cell_renderer2 = new GtkCellRendererText();
        
    //adiciona renderizadores nas mesma coluna
    $column1->pack_start($cell_renderer1, false);
    $column1->pack_start($cell_renderer2, false);
        
    //adiciona renderizadores as colunas
    $column1->set_attributes($cell_renderer1, 'pixbuf',0);
    $column1->set_attributes($cell_renderer2, 'text',1);
        
    parent::append_column($column1);
        
    $this->Botao = new GtkButton;//so para ser configurado como clicado
    //return $this->tree;
    }
    /*
    *Metodo onDoubleClick
    *Executado sempre que um nodo duplamente clicado
    */
    public function onDoubleClick()
    {
        //obtem a selecao
        $treeselection = parent::get_selection();;
        //recupera o modelo e o interactor
        list($this->model, $iter) = $treeselection->get_selected();
        if($iter)
            {
            //obtem o caminho  do nodo
            $nomeprojeto=$this->model->get_value($iter, 2);
            $nometabela=$this->model->get_value($iter, 1);
            $this->projects[$nomeprojeto]['select']=$nometabela;
            $projeto=$this->projects[$nomeprojeto];
            $this->selecao=$projeto;
            $this->selection=$this->projects[$nomeprojeto];
            if($nomeprojeto!=$nometabela)
            {   $this->selecao=$this->selection;
                $botao = $this->Botao;
                $botao->clicked();
            }
            }else{
                $this->selection ='';
                }
    }
    public function node_get_row_data()
    {
    echo "\n DBTree.class 97 recuperando os dados da tabela". $this->selecao['select']."..\n";
    print_r($this->selecao['select']);
    echo "\n fim da imprecao DBTree.class linha 99 \n";
    //para utiliza corretamente preciso retornar uma array com os dados do projeto
    //sendoa variavel [Table] o nome da tabela a abrir
    $this->selecao=$this->selection;
    $this->selecao['Table']=$this->selection['select'];
    return $this->selecao;
    }
	/*
    
    *Metodo onAbrirPasta
    *Executado sempre que um nodo � clicado
    */
    public function onAbrirPasta()
    {   //se o nodo clicado for o projeto dave buscar e abrir os nomes das tabelas
        //se o nome clicado for as tabelas deve abrir a tabela (so deve abrir com um duplo clique onDoubleClick(
        //obtem a sele��o da arvore
        $icodb = GtkImage::new_from_file($Pixmaps['db']);
        $icocvs= GtkImage::new_from_file($Pixmaps['cvs']);
        $icologin = GtkImage::new_from_file($Pixmaps['login']);
        $icochec  = GtkImage::new_from_file($Pixmaps['checkout']);
        $icologout= GtkImage::new_from_file($Pixmaps['logout']);
        $treeselection = parent::get_selection();
        list($this->model, $iter) = $treeselection->get_selected();
        // se h� sele��o ...
        if($iter)
        {
            //obtem o $Properties  do nodo
            $nomeprojeto =$this->model->get_value($iter, 2);
            $projeto=$this->projects[$nomeprojeto];
            $nometabela=$this->model->get_value($iter, 1);
            $this->projects[$nomeprojeto]['select']=$nometabela;
            $this->selection=$this->projects[$nomeprojeto];
            $this->selecao=$this->selection;
            echo"\n novatabela $nometabela �tabela? =". $projeto['Table']."..";
            print_r ($projeto);
            if (!$projeto['Table']) //Database
                { echo"\n 131 projeto[Table]=". $projeto['Table']."..";
                    print_r ($projeto);
                    if ($projeto['db_name'])
                    {   print_r ($projeto);
                        
                        $properties['DbUser'] = $projeto['db_user'];
                        $apoio1=$projeto['db_user'] ;$apoio2=$properties['DbUser'] ;
                        echo "\n projeto db_user=$apoio1 =  $apoio2]";
                        $properties['DbPass'] = base64_decode($projeto['db_pass']);
                        $dbname = $properties['DbName'] = $projeto['db_name'];
                        $properties['DbHost'] = $projeto['db_ip'];
                        $properties['DbType'] = $projeto['db_type'];
                        $dir = $projeto['directory'];
                        if (!$this->opened["Database:$dir"])
                        {   Wait::On();
                            $conn   = new AgataConnection;
                            print_r($properties);
                            $Pass   = $conn->Open($properties);
                            if (!$Pass)
                            {
                                Wait::Off();
                                $conn->Close();
                                return false;
                            }
                            Wait::Off();
                          
                            $Tables = $conn->LoadTables();
                            $conn->Close();
                            echo "\n coneccao fechada";
                            foreach ($Tables as $Table)
                            { echo "\n dentro do foreach";
                                //$this->projects[$nomeprojeto]['Table']=$Table;
                                
                                $iter1 = $this->model->append($iter);
                                $this->model->set($iter1,0,$icodb);
                                $this->model->set($iter1,1,$Table);
                                $this->model->set($iter1,2,$nomeprojeto);     
                                
                            }
                            echo "\n saiu do foreach";
                            $this->opened["Database:$dir"] = true;
                            $this->projects[$nomeprojeto]['Table'] = true;
                            parent::expand_all();
                        }else
                            {
                            parent::expand_all();
                            if ($this->projects['Table'])
                                {
                                    $botao = $this->Botao;
                                    $botao->clicked();
                                }
                            }
                    }
                }else
                    {
                            
                        $this->selecao=$this->selection;
                        echo "\n DBTree.class 189 eh uma tabela". $this->projects['Table']."..\n";
                         $botao = $this->Botao;
                         $botao->clicked();
                             
                    }
        }else
        {
            if ($this->projects['Table'])
            {
                $botao = $this->Botao;
                $botao->clicked();
            }
		}
    }
    /*
    *metodo abreDiretorio
    *L� o conteudo de um diretorio e mostra na arvore de arquivos
    */
    function abreDiretorio($caminho)
    {
        //abre diretorio
        $dir =@opendir($caminho);
        if ($caminho == bar)
        {
            $caminho = '';
        }
        //percorreo conteudo do diretorio
        while (($arquivo = readdir($dir)) !== false)
        {
            //verifica se come�a com ponto ou termina com til
            if((substr(trim($arquivo),0,1) !='.') and (substr($arquivo,-1) != '~' ))
            {
                //verifica se � diretorio ou arquivo
                if(is_dir($caminho.bar.$arquivo))
                {
                    $pastas[] = $arquivo;
                }
                else
                {
                    $arquivos[] = $arquivo;
                }
            }
        }
        //adiciona nova linha no modelo
        //estalinha ira conter o bot�o subir nivel
        $iter = $this->model->append();
        $this->model->set($iter, 0 , 'gtk-go-up');
        $this->model->set($iter, 1 , 'up');
        $this->model->set($iter, 2 , $caminho . bar .'..');
        
        //verifica se encontrou pastas
        if ($pastas)
        {
            //ordena as pastas
            sort($pastas);
            
            //percorre as pastas
            foreach ($pastas as $arquivo)
            {
                $localizacao = $caminho . bar .$arquivo;
                 
                //adiciona a linha na arvore contendo pasta
                $iter = $this->model->append();
                $this->model->set($iter, 0 , 'gtk-directory');
                $this->model->set($iter, 1 , $arquivo);
                $this->model->set($iter, 2 , $localizacao); 
            }
        }
        //verifica se encontrou arquivos
        if($arquivos)
        {
            //ordena os arquivos
            sort($arquivos);
            
            //percorre os arquivos
             foreach ($arquivos as $arquivo)
            {
                $localizacao = $caminho . bar .$arquivo;
                 
                //adiciona a linha na arvore contendo arquivo
                $iter = $this->model->append();
                $this->model->set($iter, 0 , 'gtk-file');
                $this->model->set($iter, 1 , $arquivo);
                $this->model->set($iter, 2 , $Properties); 
            }
            
        }
        
    }
    /*
    *metodo setCallBack
    *Define a a��o ao selecionar arquivo
    *ou seja, a fun��o a ser executada
    */
    function setCallBack($callback)
    {
        $this->callback = $callback;
       
    }
    //fun�oes originais tentando adapitar
    /***********************************************************/
    /* Reloads the tree
    /***********************************************************/
    function ReadAgain()
    {
      /*  $this->opened = null;
        GtkCTree::clear();
        GtkCTree::thaw();
        $entries = $this->entries;
        $this->entries = null;
        
        if ($entries)
        {
            foreach($entries as $entry)
            {
                $this->AbreDiretorio($entry, null);
            }
        }
        */
    }

    /***********************************************************/
    /* Clear all the contents
    /***********************************************************/
    function Clear()
    {
        
       //limpa modelo
       $this->model->clear();
    }
    
    function AddHome($Home, $pixmap = null)
    {   
       // $this->abreDiretorio($Home);
       /* global $Pixmaps;
		$ico = ($pixmap ? $pixmap : $Pixmaps['home']);
        //pixmap deve ser o endere�o

        $node = GtkCTree::insert_node(
            $NodoNull, null, array(':: ' . $Home), 5,
            $ico[0], $ico[1], $ico[0], $ico[1], false, false);
        GtkCTree::node_set_row_data($node, 'home');
        return $node;
        */
    }

 
 	/**
	 * Opens a directory or a database element???
	 *
	 * @param	string	Name of the directory to open
	 * @param	string	Node name ???
	 * @param	string	Project name (as recorded in configuration files)
	 * @param	array	Array containing the properties of all projects known
	 */
	function AddProject($Project, $Properties)
	{
        global $Pixmaps;
		//lendo as imagens do disco
        $ico = GtkImage::new_from_file($Pixmaps['home']);
	             
        $Properties['Project'] = $Project;
        echo "\n DBTree.class 267  AddProject $Project.. propriedade = $Properties \n";
        print_r($Properties);
        
        $icotab = GtkImage::new_from_file($Pixmaps['db']);
		if (!$NodoRaiz)
		{
			$this->opened[$Diretorio] = true;
			$this->nodes[$Diretorio] = $NodoRaiz;

			if ($Properties['db_ip'] and $Properties['db_name'])
			{
                $Properties['Table'] = false;
                $iter = $this->model->append();
                $this->model->set($iter,0,$ico);
                $this->model->set($iter,1,$Project);
                $this->model->set($iter,2,$Project);//repete o nome do projeto s� na rais
                echo "\n DBTree.class 370 montando";
                $this->projects[$Project]=$Properties;
			}
		}
	}
}
?>